/**
 * AxiomView 主入口文件 (v2 - 框架版)
 * 负责定义和导出 Vue 插件
 */

import * as commonComponents from './components/common/index.js'
import * as mobileComponents from './components/mobile/index.js'
import * as pcComponents from './components/pc/index.js'

import * as ElIcons from '@element-plus/icons-vue' // 导入所有图标

import apiClient, { initializeApiClient } from './utils/apiClient.js'
import { useConfirm } from './utils/useConfirm.js' // [修正] 从正确的路径导入
import { useNotification } from './utils/useNotification.js';
import { debounce } from './utils/debounce.js'
import { createLogger, logger } from './utils/logger.js'
import * as authUtils from './utils/auth.js'; // [最终修复] 恢复导入，供内部使用
import { useThemeStore } from './stores/theme.js'
import { createApp, h } from 'vue'
import AxiomNotificationProvider from './components/common/AxiomNotificationProvider.vue'

// [最终修复] 明确导入所有需要从框架重新导出的 auth 工具函数
import { 
  getAccessToken, 
  setAccessToken, 
  getRefreshToken, 
  setRefreshToken, 
  removeTokens, 
  isLoggedIn 
} from './utils/auth.js';

// [最终修复] 恢复框架内部使用的工具聚合对象
const axiomUtils = {
  auth: authUtils,
};

// 合并所有组件到一个对象中
const allComponents = {
  ...commonComponents,
  ...mobileComponents,
  ...pcComponents,
}

// 导入所有样式
import './styles/index.scss'

// 导入其他可单独使用的模块

// 定义 Vue 插件
const AxiomView = {
  install(app, options = {}) {
    logger.info('[AxiomView install] 插件开始安装，接收到的 options:', options);

    // 1. 全局注册所有 Axiom 组件
    for (const componentName in allComponents) {
      const component = allComponents[componentName]
      if (component && component.name) {
        app.component(component.name, component)
      }
    }

    // 1.1 全局注册所有 Element Plus 图标
    for (const [key, component] of Object.entries(ElIcons)) {
      app.component(key, component)
    }

    // 2. 配置 apiClient
    logger.info('[AxiomView install] 准备调用 initializeApiClient...');
    // 关键修复：将主应用的 pinia 实例传递给 apiClient，以确保全局共享同一个 store
    const piniaInstance = app.config.globalProperties.$pinia;
    initializeApiClient({ ...options, pinia: piniaInstance });

    // [最终修复] 使用工厂函数创建一次通知处理器的单例
    const notification = useNotification(piniaInstance);

    // [最终修复] 使用恢复后的 axiomUtils 对象
    const finalAxiomUtils = {
      ...axiomUtils,
      api: apiClient,
      notification: notification, // [最终修复] 注入正确的处理器实例
      useConfirm: useConfirm(app),
      auth: {
        ...axiomUtils.auth, // 包含 get/set token 等
        // 将 auth aptions (clientId, clientSecret) 注入，以备后用
        ...options.auth,
      }
    };

    // 3. 将最终的工具集注入到应用中
    app.config.globalProperties.$axiom = finalAxiomUtils;
    app.provide('axiom-utils', finalAxiomUtils);

    // [最终修复] 自动将 Notification Provider 挂载到 body 的顶层
    const notificationContainer = document.createElement('div');
    notificationContainer.id = 'axiom-notification-provider-container';
    document.body.appendChild(notificationContainer);
    
    const providerApp = createApp({
      render: () => h(AxiomNotificationProvider)
    });

    // 关键: 确保 Provider 使用主应用的 Pinia 实例
    if (piniaInstance) {
      providerApp.use(piniaInstance);
      
      // 主题同步
      const themeStore = useThemeStore(piniaInstance);
      notificationContainer.dataset.theme = themeStore.theme;
      themeStore.$subscribe((mutation, state) => {
        notificationContainer.dataset.theme = state.theme;
      });
    } else {
      console.error('[AxiomView] Pinia 实例未找到。请在调用 app.use(AxiomView) 之前安装 Pinia。');
    }

    providerApp.mount(notificationContainer);

    // 4. 主题会自动初始化
    // initializeTheme() is removed

    // 5. 开发模式下的辅助
    if (import.meta.env.MODE === 'development') {
      // 暴露 apiClient 以便调试
      window.$axiom = { ...axiomUtils, apiClient };
      logger.info('[AxiomView install] AxiomView 框架已加载。API Client 已配置。')
    }
  },

  version: '0.1.3', // 版本升级
}

// ===== 按需导出 =====

// 导出所有组件，支持按需导入
export * from './components/common/index.js'
export * from './components/mobile/index.js'
export * from './components/pc/index.js'

// [最终修复] 明确地、安全地导出所有公共 API
export { 
  useThemeStore, 
  apiClient, 
  useNotification, // [最终修复] 导工厂函数，并重命名为 useNotification 以保持 API 一致性
  debounce, 
  logger, 
  createLogger, 
  useConfirm,
  getAccessToken,
  setAccessToken,
  getRefreshToken,
  setRefreshToken,
  removeTokens,
  isLoggedIn
}

// 默认导出插件本身
export default AxiomView